package com.xiaoma.config.config;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * 功能描述： redis缓存 通用的db操作
 * @author: hlzhao
 * @date: 2018年4月23日
 */
//@Service
public class RedisCaCheRepository {

	// 实例化 RedisTemplate<String, Object>
	@Resource(name = "objRedisTemplate")
	private RedisTemplate<String, Object> objRedisTemplate;

	@Resource(name = "stringRedisTemplate")
	private StringRedisTemplate stringRedisTemplate;

	@Resource
	private RedisTemplate<String, ?> redisTemplate;

    
    public void expire(String key, long timeout, TimeUnit unit){
        stringRedisTemplate.expire(key, timeout, unit);
    }
    /**
     * 功能描述：从队列的左侧插入一条数据
     * @param key
     * @param obj
     * @author: hlzhao
     * @date: 2018年4月23日
     */
    public void deleteKey(String key){
        stringRedisTemplate.delete(key);
    }
    /**
     * 功能描述：从队列的左侧插入一条数据
     * @param key
     * @param obj
     * @author: hlzhao
     * @date: 2018年4月23日
     */
    public boolean setNx(String key, String obj){
        return stringRedisTemplate.opsForValue().setIfAbsent(key, obj);
    }
    /**
     * 功能描述：从队列的左侧插入一条数据
     * @param key
     * @param obj
     * @author: hlzhao
     * @date: 2018年4月23日
     */
	public void leftPush(String key, Object obj) {
		objRedisTemplate.boundListOps(key).leftPush(obj);
	}

    /**
     * 功能描述：从队列的右侧弹出一条数据
     * @param key
     * @return
     * @author: hlzhao
     * @date: 2018年4月23日
     */
    public Object rightBlockPop(String key){
        return objRedisTemplate.boundListOps(key).rightPop(1, TimeUnit.MINUTES);
	}
	
    public Object rightPop(String key){
        return objRedisTemplate.boundListOps(key).rightPop();
    }
    
    /**
     * 功能描述：根据key获取value
     * @param key
     * @return
     * @author: hlzhao
     * @date: 2018年4月23日
     */
	public Object getValue(String key) {
		return objRedisTemplate.boundValueOps(key).get();
	}

    /**
     * 功能描述：向redis插入一条key value数据
     * @param key
     * @param obj
     * @author: hlzhao
     * @date: 2018年4月23日
     */
	public void setValue(String key, Object obj) {
		objRedisTemplate.opsForValue().set(key, obj);
	}
	
    /**
     * 功能描述：向redis插入一条key value数据 并设置有效期
     * @param key
     * @param obj
     * @param timeout
     * @param timeunit
     * @author: hlzhao
     * @date: 2018年4月23日
     */
	public void setValue(String key, Object obj,long timeout,TimeUnit timeunit) {
		objRedisTemplate.opsForValue().set(key, obj,timeout,timeunit);
	}
	
    /**
     * 功能描述：向redis插入一条key value数据（字符串） 并设置有效期
     * @param key
     * @param timeout
     * @param timeunit
     * @author: hlzhao
     * @date: 2018年4月23日
     */
	public void setStrValue(String key, long timeout, TimeUnit timeunit) {
		stringRedisTemplate.opsForValue().set(key, key,timeout,timeunit);
	}
	
	/**
	 * 功能描述：设置字符串值，key value均为字符串
	 * @param key
	 * @param value
	 * @author: hlzhao
	 * @date: 2018年4月23日
	 */
	public void setStrValue(String key, String value){
		stringRedisTemplate.opsForValue().set(key, value);
	}
	
	/**
	 * 功能描述：获取字符串类型值
	 * @param key
	 * @return
	 * @author: hlzhao
	 * @date: 2018年4月23日
	 */
	public String getStrValue(String key){
		return stringRedisTemplate.boundValueOps(key).get();
	}
	
	/**
	 * 功能描述：删除字符串类型值
	 * @param key
	 * @author: hlzhao
	 * @date: 2018年4月23日
	 */
	public void removeStrValue(String key) {
		stringRedisTemplate.delete(key);
	}

	/**
	 * 功能描述：key对应的value为数字字符时 根据key，将其value值自增+1 redis中有此key，自增+1，没有key，新建key再自增+1
	 * @param key
	 * @return
	 * @author: hlzhao
	 * @date: 2018年4月23日
	 *//*
	public Long incr(String key) {

		// redis原子性 自增 自减实现
		RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());

		// 当前key的value自增一次，先自增，再获取自增后的值，返回值为自增之后的值
		Long increment = entityIdCounter.incrementAndGet();

		// 当前key的value自增一次，先获取value，再自增，返回值为自增前的值
		// Long increment = entityIdCounter.getAndIncrement();

		
		 * if ((null == increment || increment.longValue() == 0) && liveTime >
		 * 0) {//初始设置过期时间 entityIdCounter.expire(liveTime, TimeUnit.SECONDS); }
		 

		return increment;
	}
	
	*//**
	 * 功能描述：key对应的value为数字字符时 根据key，将其value值自减-1
	 * @param key
	 * @return
	 * @author: hlzhao
	 * @date: 2018年4月23日
	 *//*
	public Long decr(String key) {
		// redis原子性 自增 自减实现
		RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());

		// 当前key的value自增一次，先自减，再获取自减后的值，返回值为自减之后的值
		Long decrement = entityIdCounter.decrementAndGet();

		// 当前key的value自减一次，先获取value，再自减，返回值为自减前的值
		// Long decrement = entityIdCounter.getAndDecrement();

		return decrement;
	}*/

}
